#pragma once
#include"../Channel/Channel.hpp"
#include"../Socket/Socket.hpp"

class Acceptor{
private:
    Socket _socket;//监听套接字的创建
    EventLoop* _loop;//监听套接字的事件监控
    Channel _channel;//监听套接字的事件管理
    using ConnectCallback = std::function<void(int)>;
    ConnectCallback _connect_callback;//服务器模块设定的，用于对新连接建立Connection的回调

    //创建监听套接字
    int create_lis(uint16_t port)
    {
        bool ret = _socket.CreateServer("0.0.0.0", port, false);
        if(ret == false)
        {
           return -1;
        }
        return _socket.get_fd();
    }

    //读事件回调
    void Handle()
    {
        int newfd = _socket.Accept();
        if(newfd < 0)
        {
            return;
        }
        if(_connect_callback != nullptr)
        {
            std::cout << "获取到一个连接"<< std::endl;
            _connect_callback(newfd);
        }
    }
public:
    Acceptor(EventLoop* loop, uint16_t port)
    :_loop(loop)
    ,_channel(create_lis(port), loop)
    {
        _channel.set_read_callback(std::bind(&Acceptor::Handle, this));
        //此处不能立即启动可读事件监控，因为读事件处理中要使用Connection的回调，此时并没有设置这个回调
        //就会出现读事件到来，却无法处理的情况，所以开启读事件监控需要单独设置一个接口
    }

    //设置Connection回调
    void SetConnectionCallback(ConnectCallback cb)
    {
        _connect_callback = cb;
    }

    //开启读事件监控
    void Listen()
    {
        _channel.EnableRead();
    }
};